package javacommon.util;

import java.lang.reflect.Field;
import java.util.Hashtable;
import java.util.List;

public class EntityListUtil {
	/**
	 * 将查询得到的entityList，指定entity的某一字段作为hs的key,指定entity的某一字段作为hs的value
	 * 适用于查询 、列表 页面中。
	 * @param list	执行查询得到的list
	 * @param hsKeyField	将entity中的序号属性字段名称作为hs的key
	 * @param hsValueField	将entity中的值属性字段名称作为hs的value
	 * @return	hs
	 * @throws Exception
	 */
	public static Hashtable codeList2Hs(List list,String hsKeyField,String hsValueField) throws Exception{

		return codeList2Hs(list,hsKeyField,hsValueField,"");
	}
	public static Hashtable codeList2Hs(List list) throws Exception{
		return codeList2Hs(list,"refCode","refText");
	}


	/**
	 * 将查询得到的entityList，指定entity的某一字段作为hs的key,指定entity的某一字段作为hs的value
	 * 适用于查询 、列表 页面中。
	 * @param list 执行查询得到的list
	 * @param hsKeyField	将entity中的序号属性字段名称作为hs的key
	 * @param hsValueField 将entity中的值属性字段名称作为hs的value
	 * @param fillStr 分隔字符串
	 * @return
	 * @throws Exception
	 */
	public static Hashtable codeList2Hs(List list,String hsKeyField,String hsValueField,String fillStr) throws Exception{
		Hashtable hs = new Hashtable();

		if(hsKeyField==null || hsKeyField.equals(""))
			throw new Exception("codeList2Hs parameter : [hsKeyField]: value is null or emtpy");

		if(hsValueField==null || hsValueField.equals(""))
			throw new Exception("codeList2Hs parameter : [hsKeyField]: value is null or emtpy");

		for(int i=0;i<list.size();i++){
			Object obj = list.get(i);

			String key = "";

			String[] keyFields = hsKeyField.split("[|]");

			for(int j=0;j<keyFields.length;j++){
				String str = (String)getValueInObject(obj,keyFields[j]);
				key = key + JPC.view(str);
				if(j<keyFields.length-1) key = key + fillStr;
			}

			String value= "";

			String [] valueFields = hsValueField.split("[|]");

			for(int h=0;h<valueFields.length;h++){
				String str = "";
				if(valueFields[h].equals("$index"))
					str = new Integer(i+1).toString();
				else
					str = (String)getValueInObject(obj,valueFields[h]);
				value = value + JPC.view(str);
				if(h<valueFields.length-1) value = value + fillStr;
			}


			if(value!=null) hs.put(key,value);
		}
		return hs;
	}

	private static String getValueInObject(Object obj,String field) throws Exception{
		Field keyField = obj.getClass().getDeclaredField(field);

		/*if(!keyField.getType().getName().equals("java.lang.String")){
			throw new Exception("getValueInObject : object's field type error");
		}*/
		keyField.setAccessible(true);
		return keyField.get(obj).toString();
	}

	/**
	 * 功能：查询entityList中的entity的某一字段keyFieldName的值，并判断是否与keyObj相等，
	 * 		相等则取出entity的valueFieldName字段值作为返回值，反之为null
	 * 适用于显示单一记录 页面中。
	 * @param entityList entity列表
	 * @param keyFieldName	指定entity的关键字属性
	 * @param valueFieldName	指定entity的取值属性
	 * @param keyObj	与entity的关键字属性值相比较的比较值
	 * @return
	 * @throws Exception
	 */
	public static String getValueBycodeList(List entityList,String keyFieldName,String valueFieldName,String keyObj) throws Exception{
		String value =null;

		if(keyFieldName==null || keyFieldName.equals(""))
			throw new Exception("getValueBycodeList parameter[keyFieldName]: value is null or emtpy");

		for(int i=0;i<entityList.size();i++){
			Object obj = entityList.get(i);

			Field keyField = obj.getClass().getDeclaredField(keyFieldName);
			if(!keyField.getType().getName().equals("java.lang.String")){
				throw new Exception("getValueBycodeList:key field type error");
			}
			keyField.setAccessible(true);
			String key = (String)keyField.get(obj);

			if(!key.equals(keyObj))	continue;

			if(valueFieldName==null || valueFieldName.equals(""))
				throw new Exception("getValueBycodeList parameter[valueFieldName]: value is null or empty");
			Field valueField = obj.getClass().getDeclaredField(valueFieldName);
			if(!valueField.getType().getName().equals("java.lang.String")){
				throw new Exception("getValueBycodeList:value field type error");
			}
			valueField.setAccessible(true);
			value = (String)valueField.get(obj);

			break;
		}
		return value;
	}

	/**
	 * 从LIST中得到指定列的值字符串，并用指定的分隔字符串分隔。
	 * @param entityList 指定的实体列表
	 * @param colFieldName 指定的列名称
	 * @param splitStr 分隔字符串
	 * @return
	 * @throws Exception
	 */
	public static String getColValueArrayByCodeList(List entityList,String colFieldName,String splitStr) throws Exception{
		String result = "";

		if(colFieldName==null || colFieldName.equals(""))
			throw new Exception("getColValueArrayByCodeList parameter[colFieldName]: value is null or emtpy");

		for(int i=0;i<entityList.size();i++){
			Object obj = entityList.get(i);
			Field field = obj.getClass().getDeclaredField(colFieldName);
			if(!field.getType().getName().equals("java.lang.String")){
				throw new Exception("getColValueArrayByCodeList:col field type error");
			}
			field.setAccessible(true);
			String fieldValue = (String)field.get(obj);

			result = result + fieldValue;

			if(i<entityList.size()-1) result = result + splitStr;
		}
		return result;
	}

}
